<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">

        //1
        function Grand(){}
        function Parent(){}
        Grand.prototype.tskill='拉二胡'
        var grand=new Grand();
        // Parent.prototype=grand;
        var parent=new Parent();
        Parent.prototype.tskill='弹琴';
        console.log(parent.tskill);
        console.log(grand.tskill);


//         继承

// 继承就是子[类继承](https://so.csdn.net/so/search?q=类继承&spm=1001.2101.3001.7020)父类的特征和行为，
//使得子类对象（实例）具有父类的属性和方法，或子类从父类继承方法，使得子类具有父类相同的行为。

// ### 原型链继承

// 会将父级上的所有属性和方法统统继承过来：过多地继承没用的属性


//         // // 1. 
        function Test(){
        this.name = name;
        this.age = age;
        }
        obj = {}
        


        // Test.call(obj,name='张三',age=15)
        Test.call(obj,[name='张三',age=15])
        console.log(obj);
        // 分别使用call，apply为obj添加name，age属性
//         2.
//      实现陈鹏买车，其中有sayHi方法，功能:打印'陈鹏买了一辆红色的2.0宝马车'
            function Fun(){
            this.name = '陈鹏'
        }
        Fun.prototype.sayHi='买了一辆红色的2.0宝马车';
        var fun = new Fun();
        console.log(fun.name+fun.sayHi);
// Grand.prototype.Intro = () => { console.log('陈鹏买了一辆红色的2.0宝马车');}

        // 3.父类Shape （属性有:name,length,width,方法有:Intro 我是XX形）

        // 子类： Circle(属性有:r)

        // 分别使用 原型链继承 构造函数继承 圣杯继承

        //原型链继承 
        function Shape (){}//父类S
        function Circle(){}
        Shape.prototype.name='张三'
        var shape=new Shape();
        Circle.prototype=shape;
        var circle= new Circle();
        circle.__proto__.r='2';
        console.log(circle.r);


        //构造函数继承
        function Shape (name){
            this.name=name
        }
        function Circle(r,name){
            
            Shape.call(this,name)
            this.r=r
        }
        var circle = new Circle(2,'张三')
    
        console.log(circle.name);




        //圣杯继承
        function Shape (){}
        function Circle(){}
        Shape.prototype.name='张三'
        function inherit(Target,Origin){
            function f(){}
            f.prototype=Origin.prototype;
            Target.prototype=new f()
            Target.prototype.constructor=Target;
            Target.prototype.uber=Origin;
        }
        inherit(Circle,Shape);
        var circle=new Circle();
        console.log(circle);

    </script>
</body>
</html>